//在一个由 '0' 和 '1' 组成的二维矩阵内，找到只包含 '1' 的最大正方形，并返回其面积。
//
//
//
// 示例 1：
//
//
//输入：matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"]
//,["1","0","0","1","0"]]
//输出：4
//
//
// 示例 2：
//
//
//输入：matrix = [["0","1"],["1","0"]]
//输出：1
//
//
// 示例 3：
//
//
//输入：matrix = [["0"]]
//输出：0
//
//
//
//
// 提示：
//
//
// m == matrix.length
// n == matrix[i].length
// 1 <= m, n <= 300
// matrix[i][j] 为 '0' 或 '1'
//
//
// Related Topics 数组与矩阵 动态规划 矩阵 👍 1464 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function maximalSquare(matrix: string[][]): number {

    /*?
        ? 对于(i > 0 && j > 0)情况，当前位置边长长度等于左，左上，上三个方向边长长度的最小值，然后加 1，
        ? 于是我们遍历整个矩阵，对于当前值为 1 的情况，我们每次求一下它能拓展到的最大边长，然后每次迭代求出结果的最大边长，那么面积就是边长*边长返回即可
    ?*/
    if (!matrix || !matrix.length) return 0;
    let res = 0; //? 设置最长边长变量
    let n = matrix.length,
        m = matrix[0].length;
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < m; j++) {
            if (matrix[i][j] === '1') {
                //? 对于(i > 0 && j > 0)情况(非此情况边长就是值)，当前位置边长长度等于左，左上，上三个方向边长长度的最小值，然后加1
                i > 0 &&
                j > 0 &&
                (matrix[i][j] =
                    Math.min(+matrix[i - 1][j], +matrix[i - 1][j - 1], +matrix[i][j - 1]) +
                    1 + '');
            }
            res = Math.max(res, +matrix[i][j]); //? 迭代求最长边长
        }
    }
    return res ** 2; //? 返回边长*边长


};
//leetcode submit region end(Prohibit modification and deletion)
